package org.ne.banksys.utils;

/**
 * @author wey
 * @date 2025/6/18 上午9:53 06
 **/
import java.util.concurrent.ThreadLocalRandom;

public class CardIdCreateUtils {

    private static final String FIXED_PREFIX = "10103576";
    // 固定前8位

    // 生成符合规范的银行卡号
    public static String createCardId() {
        // 生成7位随机数字（后8位的前7位）
        int randomValue = ThreadLocalRandom.current().nextInt(0, 10000000);
        String randomPart = String.format("%07d", randomValue);
        // 格式化为7位数字

        String cardWithoutChecksum = FIXED_PREFIX + randomPart;
        // 拼接前15位
        char checksum = calculateLuhnCheckDigit(cardWithoutChecksum);
        // 计算校验位

        return cardWithoutChecksum + checksum;
        // 返回完整16位卡号
    }

    // Luhn算法计算校验位
    private static char calculateLuhnCheckDigit(String number) {
        int sum = 0;
        boolean alternate = false;
        // 标记是否为偶数位（从右向左）

        for (int i = number.length() - 1; i >= 0; i--) {
            int digit = Character.getNumericValue(number.charAt(i));

            if (alternate) {
                digit *= 2;
                if (digit > 9) digit = digit - 9;
                // 处理两位数
            }

            sum += digit;
            alternate = !alternate;
            // 切换奇偶位标记
        }

        int checksum = (10 - (sum % 10)) % 10;
        return (char) (checksum + '0');
        // 转为字符
    }

    // 测试生成卡号
    public static void main(String[] args) {
        System.out.println("生成的卡号示例:");
        for (int i = 0; i < 5; i++) {
            System.out.println(createCardId());
        }
    }
}
